/**
 * 事件管理器
 * 提供统一的事件监听、触发、移除功能
 */

export class EventEmitter {
  private events: Map<string, Set<Function>> = new Map();

  /**
   * 监听事件
   * @param event 事件名称
   * @param callback 回调函数
   * @returns 返回取消监听的函数
   */
  on(event: string, callback: Function): () => void {
    if (!this.events.has(event)) {
      this.events.set(event, new Set());
    }
    this.events.get(event)!.add(callback);

    // 返回取消监听的函数
    return () => {
      this.off(event, callback);
    };
  }

  /**
   * 监听事件（仅触发一次）
   * @param event 事件名称
   * @param callback 回调函数
   */
  once(event: string, callback: Function): void {
    const wrapper = (...args: any[]) => {
      callback(...args);
      this.off(event, wrapper);
    };
    this.on(event, wrapper);
  }

  /**
   * 移除事件监听
   * @param event 事件名称
   * @param callback 回调函数（可选，不传则移除该事件的所有监听）
   */
  off(event: string, callback?: Function): void {
    if (!this.events.has(event)) {
      return;
    }

    if (callback) {
      this.events.get(event)!.delete(callback);
      // 如果没有监听器了，删除该事件
      if (this.events.get(event)!.size === 0) {
        this.events.delete(event);
      }
    } else {
      // 移除该事件的所有监听
      this.events.delete(event);
    }
  }

  /**
   * 触发事件
   * @param event 事件名称
   * @param args 参数
   */
  emit(event: string, ...args: any[]): void {
    if (!this.events.has(event)) {
      return;
    }

    const callbacks = this.events.get(event)!;
    callbacks.forEach(callback => {
      try {
        callback(...args);
      } catch (error) {
        console.error(`Error in event handler for "${event}":`, error);
      }
    });
  }

  /**
   * 移除所有事件监听
   */
  removeAllListeners(): void {
    this.events.clear();
  }

  /**
   * 获取指定事件的监听器数量
   * @param event 事件名称
   * @returns 监听器数量
   */
  listenerCount(event: string): number {
    return this.events.get(event)?.size || 0;
  }
}

